package memento;

import java.awt.Color;
import java.awt.Font;
import java.awt.Point;
import java.util.Iterator;
import java.util.List;

import javax.media.opengl.awt.GLJPanel;

import vista.objetos.AtributoGraficable;
import vista.objetos.AtributoTipoNoSoportadoException;
import vista.objetos.EntidadRolGraficable;
import vista.objetos.GraficableConEtiquetaConAtributos;
import vista.objetos.GraficableException;

public abstract class MementoGraficableConAtributo extends MementoGraficable {

	private List<AtributoGraficable> atributos;
	private List<EntidadRolGraficable> referenciasExternas;

	public MementoGraficableConAtributo(GraficableConEtiquetaConAtributos guardable, Point posicion) 
	{
		super(guardable, posicion);
		this.atributos = guardable.getAtributos();
		this.referenciasExternas = guardable.getReferenciasExternas();
	}
	
	protected void cargarAtributos()
	{
		GraficableConEtiquetaConAtributos graficableConAtributo = (GraficableConEtiquetaConAtributos) super.getGuardable();
		List<AtributoGraficable> listAtriNuevos = graficableConAtributo.getAtributos();
		
		try {
			graficableConAtributo.setAtributos(atributos); //seteo los atributos q tenía antes de ser editado
		} catch (AtributoTipoNoSoportadoException e) {
			e.printStackTrace();
		} catch (GraficableException e) {
			e.printStackTrace();
		}
		
		if (listAtriNuevos != atributos && graficableConAtributo.getDiagrama().soyElDiagramaActual())
		{
			borrarDeHojaAtributosViejos(listAtriNuevos);
			agregarAHojaAtributosNuevos(graficableConAtributo);
		}
	}
	
	private void agregarAHojaAtributosNuevos(GraficableConEtiquetaConAtributos grafConAtri) 
	{
		GLJPanel panel = grafConAtri.getContenedor();
		Font fuente = grafConAtri.getEtiqueta().getFont();
		Color color = grafConAtri.getEtiqueta().getForeground();
		
		for (AtributoGraficable atributo: grafConAtri.getAtributos() )
			atributo.agregarseAlCanvas(panel, fuente, color);
	}

	private void borrarDeHojaAtributosViejos(List<AtributoGraficable> listAtriViejos) 
	{
		Iterator<AtributoGraficable> itAtributo = listAtriViejos.iterator();
		
		while (itAtributo.hasNext())
			itAtributo.next().borrarseDeLaHoja();
	}

	protected void cargarReferencias()
	{

	}
	
	protected List<EntidadRolGraficable> getReferenciasExternas() {
		return this.referenciasExternas;
	}

}
